#ifndef _LL_USART_H_
#define _LL_USART_H_

#include "stm32f4xx_ll_usart.h"
#include "stm32f4xx_ll_bus.h"
#include "stm32f4xx_ll_dma.h"

#ifdef __cplusplus
extern "C" {
#endif

#if defined (USART1) || defined (USART2) || defined (USART3) || defined (USART6) \
    || defined (UART4) || defined (UART5)

#if defined(USE_FULL_LL_DRIVER)
//最大串口个数
#define UART_MAX        6   
// 读取超时，在阻塞状态下可使用
#define UART_RX_TIMEOUT 0xffff  
// UART使用的GPIO引脚，这里使用了IOTGPIO驱动，开发者可根据情况修改引脚配置
#define UART1_RX        PA10
#define UART1_TX        PA9
#define UART2_RX        PA3
#define UART2_TX        PA2
#define UART3_RX        PB11
#define UART3_TX        PB10
#define UART4_RX        PC11
#define UART4_TX        PC10
#define UART5_RX        PD2
#define UART5_TX        PC12
#define UART6_RX        PC7
#define UART6_TX        PC6
// 接收缓冲区长度
#define UART1_RX_LEN    1024*1
#define UART2_RX_LEN    1024*1
#define UART3_RX_LEN    1024*1
#define UART4_RX_LEN    1024*1
#define UART5_RX_LEN    1024*1
#define UART6_RX_LEN    1024*1

// 类型定义
typedef unsigned char HWI_ARG_T;
typedef void (*HWI_PROC_FUNC)(HWI_ARG_T arg);
typedef void (*DMA_PROC_FUNC)();
typedef void (*UartIsrCallbackFunc) (char *arg);

typedef struct
{
    uint16_t rxPin;			// 接收引脚
    uint16_t txPin;			// 发送引脚
    uint8_t rxBlock;      // 接收阻塞
    uint8_t txBlock;      // 发送阻塞
    USART_TypeDef *UARTx;	// 串口号
    LL_USART_InitTypeDef luart;	// 串口结构
    uint8_t recvID;			// 接收队列id
    uint16_t recvLen;		// 接收缓冲区长度
	uint8_t UART_IRQn;		// 中断号
    HWI_PROC_FUNC recvHandler;	// 中断处理函数
	uint8_t rxDmaIRQn;		// dma中断号
    uint32_t rxStream;		// dma流
    uint32_t dmaChannel;	// dma通道
    DMA_TypeDef *dma;		// dma句柄
    DMA_PROC_FUNC rxDmaHandler;	// dma接收中断处理函数
} UART_Config;

static void UART1_RecvHandler(HWI_ARG_T arg);
static void UART1_RxDmaHandler();
static void UART2_RecvHandler(HWI_ARG_T arg);
static void UART2_RxDmaHandler();
static void UART3_RecvHandler(HWI_ARG_T arg);
static void UART3_RxDmaHandler();
static void UART4_RecvHandler(HWI_ARG_T arg);
static void UART4_RxDmaHandler();
static void UART5_RecvHandler(HWI_ARG_T arg);
static void UART5_RxDmaHandler();
static void UART6_RecvHandler(HWI_ARG_T arg);
static void UART6_RxDmaHandler();
USART_TypeDef *LL_GET_USARTx(uint8_t id);
uint8_t LL_UART_CONFIG_Init(uint8_t id);
void LL_UART_DMA_Init(uint8_t id);
void LL_UART_DMA_DeInit(uint8_t id);
#endif /* USE_FULL_LL_DRIVER */

#endif /* USART1 || USART2 || USART3 || USART6 || UART4 || UART5 || UART7 || UART8 || UART9 || UART10 */

#ifdef __cplusplus
}
#endif

#endif /* _HAL_USART_H_ */
